Governor Limit Optimization Techniques Apex কোড লেখার সময় Governor Limits মেনে চলার জন্য কিছু গুরুত্বপূর্ণ পদ্ধতি ও স্ট্র্যাটেজি, যা Salesforce প্ল্যাটফর্মের স্থায়িত্ব ও পারফরম্যান্স উন্নত করতে সাহায্য করে। Salesforce-এর মাল্টি-টেন্যান্ট আর্কিটেকচারে একাধিক ব্যবহারকারী একত্রে কাজ করার কারণে Governor Limits মেনে চলা অত্যন্ত গুরুত্বপূর্ণ।
১. Bulkify Apex Code
Bulkify করার মাধ্যমে একাধিক রেকর্ডে একত্রে SOQL বা DML অপারেশন চালানো যায়। এটি SOQL বা DML অপারেশনের সংখ্যা কমিয়ে Governor Limits বজায় রাখতে সহায়ক।
উদাহরণ:
public void updateAccounts(List<Account> accounts) {
List<Account> accountsToUpdate = new List<Account>();
for (Account acc : accounts) {
if (acc.Industry == 'Technology') {
acc.Rating = 'Hot';
accountsToUpdate.add(acc);
}
}
// Bulk DML Operation
if (!accountsToUpdate.isEmpty()) {
update accountsToUpdate;
}
}
- এখানে একাধিক
Accountরেকর্ডকে একত্রেupdateঅপারেশন চালিয়ে Governor Limits বজায় রাখা হয়েছে।
২. Efficient Querying Techniques
SOQL কুয়েরিতে শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো কুয়েরি করুন এবং কুয়েরিতে WHERE ক্লজ ব্যবহার করে রেকর্ড ফিল্টার করুন। এতে SOQL কুয়েরির সংখ্যা কমানো যায় এবং ডেটা ফেচিং সীমার মধ্যে থাকে।
উদাহরণ:
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Industry = 'Technology'];
- এখানে শুধুমাত্র
IdএবংNameফিল্ড এবং নির্দিষ্টIndustryভিত্তিক রেকর্ড ফেচ করা হয়েছে।
৩. Collections (List, Set, Map) ব্যবহার করুন
Bulk SOQL এবং DML অপারেশন পরিচালনার জন্য Collections যেমন List, Set, এবং Map ব্যবহার করুন। এগুলো ডুপ্লিকেট রেকর্ড ম্যানেজ করতে এবং পারফরম্যান্স উন্নত করতে সহায়ক।
উদাহরণ:
Set<Id> accountIds = new Set<Id>();
for (Contact con : contacts) {
accountIds.add(con.AccountId);
}
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Id IN :accountIds];
- এখানে
Setব্যবহার করে ডুপ্লিকেট Account Id অপসারণ করে একত্রে SOQL কুয়েরি করা হয়েছে।
৪. Avoid SOQL and DML Inside Loops
SOQL বা DML স্টেটমেন্ট লুপের ভিতরে ব্যবহার না করা উচিত। লুপের ভিতরে SOQL বা DML স্টেটমেন্ট ব্যবহার করলে Governor Limits দ্রুত পূরণ হতে পারে।
অকার্যকর উদাহরণ:
for (Account acc : accounts) {
acc.Name = 'Updated Name';
update acc; // DML inside loop - Not recommended
}
কার্যকর উদাহরণ:
List<Account> updateAccounts = new List<Account>();
for (Account acc : accounts) {
acc.Name = 'Updated Name';
updateAccounts.add(acc);
}
update updateAccounts; // Bulk DML outside loop
- এখানে DML অপারেশন লুপের বাইরে এনে একবারেই চালানো হয়েছে।
৫. Use @future and Queueable Apex for Long-Running Processes
বড় ডেটাসেট প্রসেসিং বা দীর্ঘমেয়াদি কাজের জন্য @future এবং Queueable Apex ব্যবহার করুন। এটি Governor Limits লঙ্ঘন না করেই আলাদা ট্রানজ্যাকশনে কাজ চালিয়ে যেতে সাহায্য করে।
উদাহরণ:
@future
public static void processLargeData(List<Id> recordIds) {
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Id IN :recordIds];
for (Account acc : accounts) {
acc.Industry = 'Updated Industry';
}
update accounts;
}
- এখানে @future মেথড ব্যবহার করে বড় ডেটাসেট এক আলাদা ট্রানজ্যাকশনে প্রসেস করা হয়েছে।
৬. Use Custom Settings and Custom Metadata
SOQL কুয়েরি ব্যবহার না করে Custom Settings বা Custom Metadata থেকে ডেটা সংগ্রহ করা যায়। এতে করে SOQL কুয়েরির সংখ্যা কমে এবং Governor Limits বজায় থাকে।
উদাহরণ:
Integer maxLimit = CustomSetting__c.getInstance().Max_Limit__c;
- এখানে SOQL কুয়েরি না করে Custom Setting থেকে ডেটা আনা হয়েছে।
৭. Caching ব্যবহার করুন
Frequently used ডেটা ক্যাশে করে রাখা Governor Limits বাঁচাতে সহায়ক, কারণ এতে ডেটা পুনরায় কুয়েরি না করেই ক্যাশ থেকে ফেচ করা যায়। Caching করার মাধ্যমে বারবার SOQL কুয়েরি না করে কোড কার্যকরী হয়।
৮. Leverage Batch Apex for Large Data Volumes
Batch Apex ব্যবহার করে বড় ডেটাসেট ছোট ছোট ব্যাচে ভাগ করে প্রক্রিয়াকরণ করা যায়। এটি গভর্নর লিমিট বজায় রেখে বড় ডেটাসেট প্রক্রিয়া করতে সহায়ক।
উদাহরণ:
public class AccountBatchJob implements Database.Batchable<SObject> {
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Id, Name FROM Account');
}
public void execute(Database.BatchableContext bc, List<SObject> scope) {
List<Account> accounts = (List<Account>) scope;
for (Account acc : accounts) {
acc.Name = 'Batch Updated';
}
update accounts;
}
public void finish(Database.BatchableContext bc) {
System.debug('Batch Process Completed');
}
}
- এখানে Batch Apex ব্যবহার করে বড় ডেটাসেট প্রক্রিয়া করা হয়েছে, যা Governor Limits বজায় রাখতে সহায়ক।
৯. Proper Error Handling with Try-Catch
Exception হ্যান্ডলিংয়ের মাধ্যমে কোডের স্থায়িত্ব বৃদ্ধি করা যায়। Try-Catch ব্লক ব্যবহার করে ত্রুটি হ্যান্ডলিং করলে অ্যাপ্লিকেশন সঠিকভাবে কাজ করতে পারে এবং গভর্নর লিমিটের সীমার মধ্যে থাকে।
১০. Avoid Hard-Coding Limits
কোডে নির্দিষ্ট সংখ্যা বা মান হার্ড-কোড না করে কনফিগারেবল সেটিংস ব্যবহার করা উচিত। এতে কোড আরও স্থায়ী এবং সীমাবদ্ধতার সাথে সামঞ্জস্যপূর্ণ হয়।
সারসংক্ষেপ
Governor Limit Optimization Techniques মেনে কোডিং করলে Apex কোড গভর্নর লিমিটের মধ্যে থেকে কার্যকরীভাবে কাজ করতে পারে। কিছু গুরুত্বপূর্ণ টেকনিক নিচে সারসংক্ষেপ করা হলো:
- Bulkify Apex Code: লুপে একাধিক DML এবং SOQL অপারেশন চালানোর পরিবর্তে Bulkify করা।
- Efficient Querying Techniques: প্রয়োজনীয় ফিল্ডগুলো ফিল্টার করে কুয়েরি চালানো।
- Avoid SOQL and DML Inside Loops: লুপের বাইরে SOQL এবং DML অপারেশন চালানো।
- Use @future and Queueable Apex: দীর্ঘমেয়াদি প্রসেসের জন্য আলাদা ট্রানজ্যাকশন ব্যবহার।
- Leverage Batch Apex: বড় ডেটাসেট প্রক্রিয়ার জন্য ব্যাচিং করা।
- Proper Error Handling: Try-Catch ব্লক দিয়ে ত্রুটি হ্যান্ডল করা।
এ সকল স্ট্র্যাটেজি অনুসরণ করে Salesforce প্ল্যাটফর্মে Governor Limits বজায় রেখে কোডিং করা সম্ভব, যা অ্যাপ্লিকেশনকে স্থায়ী ও কার্যকরী করে।
Read more